'use strict';

/**
 * 将扁平化的对象还原为嵌套结构
 * @description 将使用点号（.）分隔的扁平对象转换回嵌套的对象结构
 * @param {Record<string, unknown>} flatObj - 扁平化的对象
 * @returns {Record<string, unknown>} 还原后的嵌套对象
 * @example
 * const flat = {
 *   'name': 'zs',
 *   'age': 12,
 *   'info.likes.fruit': 'apple',
 *   'info.likes.sports': ['basketball', 'football'],
 *   'info.education': null
 * };
 *
 * restoreObject(flat);
 * // 返回:
 * // {
 * //   name: 'zs',
 * //   age: 12,
 * //   info: {
 * //     likes: {
 * //       fruit: 'apple',
 * //       sports: ['basketball', 'football']
 * //     },
 * //     education: null
 * //   }
 * // }
 */
const restoreObject = (flatObj) => {
    const result = {};
    Object.entries(flatObj).forEach(([path, value]) => {
        // 跳过空路径
        if (!path)
            return;
        // 将路径分割成键数组
        const keys = path.split('.');
        let current = result;
        // 遍历路径中的每个键，除了最后一个
        for (let i = 0; i < keys.length - 1; i++) {
            const key = keys[i];
            // 如果当前键不存在，创建一个新对象
            if (!(key in current)) {
                current[key] = {};
            }
            // 如果当前值不是对象，说明路径冲突
            if (typeof current[key] !== 'object' || current[key] === null) {
                throw new Error(`路径冲突：'${path}' 与现有值冲突`);
            }
            // 移动到下一层
            current = current[key];
        }
        // 设置最终值
        const lastKey = keys[keys.length - 1];
        current[lastKey] = value;
    });
    return result;
};
/**
 * @deprecated 请使用 restoreObject 替代，它提供了更好的类型安全性和错误处理
 */
const unflattenObject = restoreObject;

exports.restoreObject = restoreObject;
exports.unflattenObject = unflattenObject;
